EF Core DbContext
Microsoft.EntityFrameworkCore.DbContext
klasse. Het is deze klasse (of, beter gezegd, de klassen die jij maakt op basis van deze klasse) die de toegangspoort tot de database is en alle methoden biedt die je nodig hebt om met de database te werken.DbContext
Voordat een klassemodel kan worden gebruikt om een query op een database uit te voeren, moet Entity Framework weten hoe het code (klassen, eigenschappen, en instanties) heen en weer moeten vertalen van C# naar SQL (in het bijzonder, tabellen, kolommen en rijen ). Daarvoor gebruikt het ORM of object relational mapping.
Een context is een klasse die erft van DBContext
en die een aantal entiteit-collecties toegankelijk maakt in de vorm van DbSet<T>
eigenschappen.
DbContext gebruiken met dependency injection
EF ondersteunt DbContext
met een dependency injection container. Je kan het DbContext type toevoegen aan de service container door gebruik te maken van AddDbContext<TContext>
.
AddDbContext
maakt en voegt een een DbContext
type, TContext
, en DbContextOptions<TContext>
toe, die dan beschikbaar is in de service container voor injectie.
Meer over Dependency injection.
- voeg de connectiestring toe appsettings.json:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*", "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=mmt;Trusted_Connection=True; MultipleActiveResultSets=true", "MmtLocal": "Server=92.222.220.213,1500;Database=_13875_JefInghelbrecht; User Id=sa;Password=xxxxxxxx;MultipleActiveResultSets=true", "Mmt": "Server=510.380.377.150;user id=Docent1;password=Docent_XXXXXX;port=3306; database=Docent1;SslMode=none" } }
- De DBContext wordt geconfigureerd in Startup.cs waar de connectiestring ingelezen wordt uit het appsettings.json configuratiebestand. De
GetConfiguration
methode haalt de waarde op die overeenkomt met de sleutelConfiguration:<connection string name>
. - In de Startup klasse moet je verwijzen naar de namespace waarin de
DbContext
klasse, die voor de database toegang gebruikt, staat:using FricFrac.Models.FricFrac;
- Evenals naar:
using Microsoft.EntityFrameworkCore;
- De naam van de
DbContext
klasse, die door scaffolding werd genereerd is de naam van de database. Als je een andere naam wilt geven, verander je de naam vanDbContext
klasse en van de namespace in dat bestand.
De naam van die DBContext klasse bestaat uit de naam van de database gevolgd door Context. In ons voorbeeld is datdocent300Context
. Voor jullie zal datuserXXX
zijn. We wijzigen de naam van de klasse en beginnen de naam met een hoofdletter zoals dat volgens afspraak in .NET moet zijn, namelijk klassenamen worden in pascalnotatie geschreven. In Visual Studio kan je de naam automatisch laten wijzigen zodat je zelf niet moet gaan opzoeken waar je die naam hebt gebruikt: - Dan voeg je
DbContext
van je app toe aan de injection container:// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddSingleton<PostcodeApp.Dal.IPostcode> (p => new PostcodeApp.Dal.PostcodeXml(new PostcodeApp.Bll.Postcode())); services.AddTransient(p => new Controllers.PostcodeController(new PostcodeApp.Dal.PostcodeXml())); services.AddDbContext<Docent300Context>(options => options.UseMySQL(Configuration.GetConnectionString("FricFracRemote"))); }
- Als je nog geen instantie hebt van de
Configuration
klasse moet je die nog eerst nog builden op basis vanappsettings.json
:namespace FricFrac { public class Startup { public IConfigurationRoot Configuration { get; } public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true); Configuration = builder.Build();
- Verwijder de volgende regel. Ik heb die regel in commentaar gezet zodat je kunt zien welke regel ik bedoel:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { #warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings. // optionsBuilder.UseMySql("server=164.132.231.13;user id=docent300;password=XXXXXX; port=3306;database=docent300;SslMode=none"); } }
- Voeg een constructor argument toe aan je
DbContext
type dat eenDbContextOption
aanvaardt:public Docent300Context(DbContextOptions<Docent300Context> options) : base(options) { }